import base64  # BASE64 编码采用 MIME 格式，字符包括大小写字母各26个，加上10个数字，和加号 + ，斜杠 / ，一共64个字符
import hashlib  # 哈希算法模块，即通过一个函数，将任意长度的数据转化为一个长度固定的数据串(通常16进制)
import json
import time
import urllib.parse  # 提供URL处理方法的工具模块
import urllib.request  # urllib：python内置的HTTP请求库,request：http请求模块，用来模拟发送请求


class sent_ana_get_result(object):
    #  todo：初使化类的属性
    def __init__(self, url_sa, APPID, APIKey, text):
        # 给出讯飞开放平台相关信息
        self.url_sa = url_sa
        self.APPID = APPID
        self.APIKey = APIKey
        # 设置业务参数
        self.Text = text

    def call_url(self):
        # todo：接口调用和返回结果解析
        # 接口调用流程
        # step1 、将文本数据写成dict形式，并转化为query-string格式并进行转码，作为Http Request Body
        # step2 、构造请求头：通过接口密钥基于MD5计算签名，将签名以及其他参数放在Http Request Header中
        # step3、构造请求对象request
        # step4、向服务器端发送请求，接收服务器端的返回结果
        # todo：step1 、将文本数据写成dict形式，并转化为query-string格式并进行转码，作为Http Request Body
        body = urllib.parse.urlencode({'text': self.Text}).encode('utf-8')
        # todo：step2 、构造请求头：通过接口密钥基于MD5计算签名，将签名以及其他参数放在Http Request Header中
        # 参数1：业务参数（服务类型，调用关键词提取功能固定为dependent），利用Base64编码生成字符串
        param = {"type": "dependent"}
        x_param = base64.b64encode(json.dumps(param).replace(' ', '').encode('utf-8'))
        # 参数2：当前UTC时间戳从1970年1月1日0点0 分0 秒开始到现在的秒数
        x_time = str(int(time.time()))
        # 参数3：令牌，计算方法：MD5(APIKey + X-CurTime + X-Param)，三个值拼接的字符串，进行MD5哈希计算（32位小写）
        x_checksum = hashlib.md5(self.APIKey.encode('utf-8') + str(x_time).encode('utf-8') + x_param).hexdigest()

        # 配置请求头参数
        x_header = {'X-Appid': self.APPID,
                    'X-CurTime': x_time,
                    'X-Param': x_param,
                    'X-CheckSum': x_checksum}

        # todo：step3、构造请求对象request，作为urlopen的参数，因urlopen不接受更多的参数
        req_sa = urllib.request.Request(self.url_sa, data=body, headers=x_header)
        # todo：step4、向服务器端发送请求，接收服务器端的返回结果
        result_sa = urllib.request.urlopen(req_sa)  # 向服务器端发送请求
        result_sa = result_sa.read().decode('utf-8')  # 返回中文分词结果，返回值为json串

        # todo：对返回结果进行解析
        result_sa = json.loads(result_sa)  # 分词结果 将字符串转化为字典
        # print(result_sa)
        score = result_sa['data']['score']
        sentiment = result_sa['data']['sentiment']
        return score, sentiment
